﻿using System.Linq.Expressions;

using Tszy.Unlimited.Base.Exceptions;

namespace Tszy.Unlimited.Data.AdoNet.Sql.Components.Expressions.Where
{
    /// <summary>
    /// WHERE 条件执行者。
    /// </summary>
    /// <remarks>
    /// 多个条件时使用 AND 区分。
    /// </remarks>
    internal class WhereExpressionExecutor : IExpressionExecutor
    {
        /// <summary>
        ///
        /// </summary>
        public string Name { get; } = ExpressionKey.WHERE;

        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        /// <param name="expression"></param>
        /// <returns></returns>
        public ExpressionExecutorResult Execute(ExpressionContext context, Expression expression)
        {
            if (expression.NodeType == ExpressionType.Lambda)
            {
                var lambdaExpression = expression as LambdaExpression;

                var lambdaResult = WhereExpressionHandler.Instance.Execute(context, lambdaExpression?.Body);

                context.Where.Add(lambdaResult);
                //if (!string.IsNullOrWhiteSpace(lambdaResult.Sql))
                //{
                //    if (!string.IsNullOrWhiteSpace(context.Where))
                //    {
                //        context.Where += $" AND ({lambdaResult.Sql})";
                //    }
                //    else
                //    {
                //        context.Where += $"({lambdaResult.Sql})";
                //    }
                //}

                return new ExpressionExecutorResult { Status = lambdaResult.Status };
            }
            else
            {
                throw new MainApplicationException("WHERE 条件表达式类型不是 Lambda");
            }
        }
    }

    ///// <summary>
    ///// WHERE 条件执行者。
    ///// </summary>
    ///// <remarks>
    ///// 多个条件时使用 OR 区分。
    ///// </remarks>
    //public class WhereOrExpressionExecutor : IExpressionExecutor
    //{
    //    /// <summary>
    //    ///
    //    /// </summary>
    //    public string Name { get; } = ExpressionKey.WHERE;

    //    /// <summary>
    //    ///
    //    /// </summary>
    //    /// <param name="context"></param>
    //    /// <param name="expression"></param>
    //    /// <returns></returns>
    //    public ExpressionExecutorResult Execute(ExpressionContext context, Expression expression)
    //    {
    //        if (expression.NodeType == ExpressionType.Lambda)
    //        {
    //            var lambdaExpression = expression as LambdaExpression;

    //            var lambdaResult = WhereExpressionHandler.Instance.Execute(context, lambdaExpression?.Body);

    //            if (!string.IsNullOrWhiteSpace(lambdaResult.Sql))
    //            {
    //                if (!string.IsNullOrWhiteSpace(context.Where))
    //                {
    //                    context.Where += $" OR ({lambdaResult.Sql})";
    //                }
    //                else
    //                {
    //                    context.Where += $"({lambdaResult.Sql})";
    //                }
    //            }

    //            return new ExpressionExecutorResult { Status = lambdaResult.Status, Sql = lambdaResult.Sql };
    //        }
    //        else
    //        {
    //            throw new MainApplicationException("WHERE 条件表达式类型不是 Lambda");
    //        }
    //    }
    //}
}